gl: Avoid a memdup in glyph upload
authorMatthias Clasen <mclasen@redhat.com>
Mon, 3 Jun 2019 02:46:12 +0000 (02:46 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 3 Jun 2019 02:47:52 +0000 (02:47 +0000)
We don't need to dup the memory here if we
set up the image surface properly. This won't
matter for most glyphs, but some of them can
be big.

gsk/gl/gskglglyphcache.c

index eb2628fb86859388a634f062634bfa6a322a5e4a..7e01b2bbd91b9abfaf06e60d23406b4a6ab94847 100644 (file)
@@ -215,6 +215,8 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   PangoGlyphString glyph_string;
   PangoGlyphInfo glyph_info;
   int surface_width, surface_height;
+  int stride;
+  unsigned char *data;
 
   scaled_font = pango_cairo_font_get_scaled_font ((PangoCairoFont *)key->font);
   if (G_UNLIKELY (!scaled_font || cairo_scaled_font_status (scaled_font) != CAIRO_STATUS_SUCCESS))
@@ -228,7 +230,11 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   if (surface_width > atlas->width || surface_height > atlas->height)
     return FALSE;
 
-  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, surface_width, surface_height);
+  stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, surface_width);
+  data = g_malloc0 (stride * surface_height);
+  surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32,
+                                                 surface_width, surface_height,
+                                                 stride);
   cairo_surface_set_device_scale (surface, key->scale / 1024.0, key->scale / 1024.0);
 
   cr = cairo_create (surface);
@@ -255,8 +261,7 @@ render_glyph (const GskGLGlyphAtlas *atlas,
   region->width = cairo_image_surface_get_width (surface);
   region->height = cairo_image_surface_get_height (surface);
   region->stride = cairo_image_surface_get_stride (surface);
-  region->data = g_memdup (cairo_image_surface_get_data (surface),
-                           region->stride * region->height * sizeof (guchar));
+  region->data = data;
   region->x = (gsize)(value->tx * atlas->width);
   region->y = (gsize)(value->ty * atlas->height);